<!DOCTYPE html>
<html>

	<head>
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1,user-scalable=no">
		<meta name="apple-mobile-web-app-capable" content="yes">
		<meta name="apple-mobile-web-app-status-bar-style" content="black">
		<link rel="stylesheet" type="text/css" href="../../css/mui.min.css" />
		<script src="../../js/mui.min.js" type="text/javascript" charset="utf-8"></script>
		<style>
			.main_content p {
				font-size: 1em;
				color: black;
				text-indent: 2em;
				padding: 6px;
			}
			.main_content img {
				padding: 8px;
			}
			.sub_header {
				text-align: center;
				background-color: rgba(0, 188, 0, 0.7);
				height: 36px;
				margin-top: 8px;
				margin-bottom: 8px;
			}
			.sub_header h3 {
				color: white;
				position: relative;
				top: 20%;
				transform: translateY(-50%);
			}
		</style>
	</head>

	<body>
		<header class="mui-bar mui-bar-nav">
			<a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>
			<h1 class="mui-title">Java 基础</h1>
		</header>
		<div class="mui-content">
			<div class="mui-content-padded" style="margin: 5px;">
				<div class="sub_header">
					<h3>接口</h3>
				</div>
				<div class="main_content">
					<p>我们使用抽象方法和抽象类作为系统的分析和设计的工具，用来实现客户关系管理业务的架构，&nbsp;
						<br /> [code=java]
						<br /> #[Keywords]public #[Keywords]abstract #[Keywords]class # CRMSystem {&nbsp;
						<br /> &nbsp;&nbsp; &nbsp;#[Keywords]public #[Keywords]abstract #Client add(Client newGuy); #[Comments]//添加用户方法 &nbsp;&nbsp; &nbsp;
						<br /> &nbsp;&nbsp; &nbsp;#[Keywords]public #[Keywords]abstract #Event add(Event e, Client guy); #[Comments]//重载添加事件、用户方法 &nbsp;&nbsp; &nbsp;
						<br /> &nbsp;&nbsp; &nbsp;#[Keywords]public #[Keywords]abstract #Event[] todayEvents(); #[Comments]//今日事件方法&nbsp;&nbsp; &nbsp;
						<br /> &nbsp;&nbsp; &nbsp;#}
						<br /> #}
						<br /> [/code]
						<br /> 如上代码中没有方法具体实现的情况，我们就可以使用接口（interface），相当于c++中的虚类。
						<br /> [code=java]
						<br /> #[Keywords]public #[Keywords]interface #CRMSystem {
						<br /> &nbsp;&nbsp; &nbsp;#Client add(Client newGuy);
						<br /> &nbsp;&nbsp; &nbsp;#Event add(Event e, Client guy);
						<br /> &nbsp;&nbsp; &nbsp;#Event[] todayEvents();
						<br /> #}
						<br /> [/code]
						<br /> [color=blue]接口的定义：接口从本质上说是一种特殊的抽象类。
						<br /> 关键字 interface。
						<br /> 在接口中，所有的方法为公开、抽象的方法：public abstract。
						<br /> 在接口中，所有的属性都是公开、静态的常量：public static final。
						<br /> 接口与接口之间可以多继承，用extends，多个之间用逗号隔开。
						<br /> 接口中没有构造方法，不能用&ldquo;new 接口名&rdquo;来实例化一个接口，但可以声明一个接口。
						<br /> 接口：全部的方法都是抽象方法，全部的属性都是常量。
						<br /> 1) 接口是特殊的抽象类。
						<br /> 2) 接口用来表示纯抽象概念，没有任何具体的方法和属性。
						<br /> 3) 接口不能实例化，可以定义变量。
						<br /> [code=java]
						<br /> Shape s = #[Keywords]new #Shape(); 错
						<br /> Shape s = #[Keywords]new #Circle(); 对
						<br /> [/code]
						<br /> 4) 接口变量可以引用具体实现类的实例。
						<br /> 5) 接口只能被实现（继承），一个具体类实现接口，必须使用全部的抽象方法。
						<br /> 6) 接口之间可以继承（implements）。
						<br /> 7) 一个具体类可以实现多个接口，实现多继承现象。
						<br /> 表示：一个概念即是XXX也是XXX。
						<br /> 8) 接口中的属性，默认是常量 public static final。
						<br /> 9) 接中的方法一定是public abstract的（默认，可以不写）。
						<br /> 10) 实现一个接口，使用关键字implements，实现实际上是一种继承关系。
						<br /> 接口和实现类是父子类型的关系。
						<br /> 案例如下所示：
						<br /> Car.java代码如下：
						<br /> [code=java]
						<br /> #[Tags]/**
						<br /> &nbsp;#[Tags]* 小汽车 概念&nbsp;
						<br /> &nbsp;#[Tags]* 表示：所有小汽车都能跑，都能停
						<br /> &nbsp;#[Tags]*/
						<br /> #[Keywords]public #[Keywords]interface #Car {
						<br /> &nbsp;&nbsp; &nbsp;#[Keywords]void #run();
						<br /> &nbsp;&nbsp; &nbsp;#[Keywords]void #stop();
						<br /> #}
						<br /> [/code]
						<br /> Product.java代码如下：
						<br /> [code=java]
						<br /> #[Tags]/**
						<br /> &nbsp;#[Tags]* 产品&nbsp;
						<br /> &nbsp;#[Tags]* 表示：产品
						<br /> &nbsp;#[Tags]*/
						<br /> #[Keywords]public #[Keywords]interface #Product {
						<br /> &nbsp;&nbsp; &nbsp;#[Keywords]double #getPrice();
						<br /> #}
						<br /> [/code]
						<br /> QQ.java代码如下：
						<br /> [code=java]
						<br /> #[Tags]/**
						<br /> &nbsp;#[Tags]* QQ 实现了Car, Product
						<br /> &nbsp;#[Tags]* 表示：QQ既是Car也是Product
						<br /> &nbsp;#[Tags]*/
						<br /> #[Keywords]public #[Keywords]class #QQ #[Keywords]implements #Car, Product {
						<br /> &nbsp;&nbsp; &nbsp;#@Override
						<br /> &nbsp;&nbsp; &nbsp;#[Keywords]public #[Keywords]double #getPrice() {
						<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;#[Keywords]return #30000;
						<br /> &nbsp;&nbsp; &nbsp;#}
						<br /> &nbsp;&nbsp; &nbsp;#@Override
						<br /> &nbsp;&nbsp; &nbsp;#[Keywords]public #[Keywords]void #run() {
						<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;#System.#[Fields]out#.println(#[Fields]&quot;启动出发&quot;#);
						<br /> &nbsp;&nbsp; &nbsp;#}
						<br /> &nbsp;&nbsp; &nbsp;#@Override
						<br /> &nbsp;&nbsp; &nbsp;#[Keywords]public #[Keywords]void #stop() {
						<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;#System.#[Fields]out#.println(#[Fields]&quot;刹车&quot;#);
						<br /> &nbsp;&nbsp; &nbsp;#}
						<br /> #}
						<br /> [/code]
						<br /> QQDemo.java代码如下：
						<br /> [code=java]
						<br /> #[Keywords]public #[Keywords]class #QQDemo {
						<br /> &nbsp;&nbsp; &nbsp;#[Keywords]public #[Keywords]static #[Keywords]void #main(String[] args) {
						<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;#QQ qq = #[Keywords]new #QQ(); #[Comments]// 创建一辆QQ汽车
						<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;#Product p = qq; #[Comments]// QQ车是一个Product
						<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;#System.#[Fields]out#.println(p.getPrice()); #[Comments]// 输出这个product的价格
						<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;#Car car = qq; #[Comments]// QQ是一个Car
						<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;#car.run(); #[Comments]// QQ开了
						<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;#car.stop(); #[Comments]// QQ停了
						<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;#Car c = (Car) p; #[Comments]// 这个product是Car，可以强转
						<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;#c.run(); #[Comments]// Car开了
						<br /> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;#c.stop(); #[Comments]// Car停了
						<br /> &nbsp;&nbsp; &nbsp;#}
						<br /> #}
						<br /> [/code]
						<br /> [color=blue]接口的作用：
						<br /> 间接实现多继承：用接口来实现多继承并不会增加类关系的复杂度。因为接口不是类，与类不在一个层次上，是在类的基础上进行再次抽象。
						<br /> 接口可以抽象出次要类型，分出主、次关系类型，符合看世界的一般方法。
						<br /> 接口隔离，与封装性有关。一个对象都有多个方面，可以只展示其中几个方面，其他的都隐藏。因此可以看为&ldquo;更高层次的封装&rdquo;，把一个大接口做成若干个小接口。
						<br /> 通过接口制定标准（最重要的作用）。
						<br /> 接口：制定标准。
						<br /> 接口的调用者：使用标准。
						<br /> 接口的实现类：实现标准。
						<br /> 解耦合作用：把使用标准和实现标准分开，使得标准的制定者和实现者解除偶合关系，具有极强的可移植性。
						<br /> 例：sun公司提供一套访问数据库的接口（标准），java程序员访问数据库时针对数据库接口编程。接口由各个数据库厂商负责实现。
						<br /> [color=blue]接口编程的原则
						<br /> 尽量针对接口编程（能用接口就尽量用接口）。
						<br /> 接口隔离原则（用若干个小接口取代一个大接口）。
						<br /> [color=red]注意：
						<br /> 接口中没有构造器，也没有main方法。
						<br /> 在类的继承中，只能做单重继承，而实现接口时，一次则可以实现多个接口，每个接口间使用逗号&ldquo;,&rdquo;分隔。这时就可能出现常量或方法名冲突的情况，解决该问题时，如果常量冲突，则需要明确指定常量的接口，这可以通过&ldquo;接口名.常量&rdquo;实现。如果出现方法冲突时，则只要实现一个方法就可以了。
					</p>

				</div>
			</div>
		</div>

	</body>

</html>